package com._23DesignPattern._create.Singleton;

/**
 * @Author: huangya
 * @Date: 2019/3/2
 * @Description: 双重检查锁
 *
 * 实例化对象的那行代码（标记为error的那行），实际上可以分解成以下三个步骤：
 *
 * 分配内存空间
 * 初始化对象
 * 将对象指向刚分配的内存空间
 * 但是有些编译器为了性能的原因，可能会将第二步和第三步进行重排序，顺序就成了：
 *
 * 分配内存空间
 * 将对象指向刚分配的内存空间
 * 初始化对象
 *
 *
 * 在这种情况下，可能访问的是一个初始化未完成的对象
 *
 */
public class SingletonDemo4 {

    //volatile可以禁止重排序
    private static volatile SingletonDemo4 singletonDemo4 = null;

    public static SingletonDemo4 getInstance(){
        if (singletonDemo4 == null) {
            synchronized (SingletonDemo.class){
                if (singletonDemo4 == null) {
                    singletonDemo4 = new SingletonDemo4();
                }
            }
        }
        return singletonDemo4;
    }

}
